--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vendor/lxmfy/lxmfy/scheduler.py dev (c9f60cc5) Text, 5.81 KB
T8b949e"""Task scheduling system for LXMFy.
This module provides cron-style scheduling and background task management
for LXMFy bots.
"""
Tff7b72import T7ee787logging
Tff7b72import T7ee787time
Tff7b72from T7ee787collectionsT7ee787.T7ee787abc Tff7b72import Te6edf3Callable
Tff7b72from T7ee787dataclasses Tff7b72import Te6edf3dataclass
Tff7b72from T7ee787datetime Tff7b72import Te6edf3datetimeTb4b4b4, Te6edf3timedelta
Tff7b72from T7ee787threading Tff7b72import Te6edf3EventTb4b4b4, Te6edf3Thread
Te6edf3logger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)
Tf0883e@dataclass
Tff7b72class T56d364ScheduledTaskTb4b4b4:
T8b949e"""A scheduled task with cron-style timing.
Attributes:
name (str): The name of the task.
callback (Callable): The function to execute when the task runs.
cron_expr (str): A cron-style expression defining when the task should run (min hour day month weekday).
last_run (Optional[datetime]): The last time the task was run.
enabled (bool): Whether the task is currently enabled.
"""
Te6edf3nameTb4b4b4: Tffa657str
Te6edf3callbackTb4b4b4: Te6edf3Callable
Te6edf3cron_exprTb4b4b4: Tffa657str
Te6edf3last_runTb4b4b4: Te6edf3datetime Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Te6edf3enabledTb4b4b4: Tffa657bool Tff7b72= Tff7b72True
Tff7b72def Td2a8ffshould_runTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3current_timeTb4b4b4: Te6edf3datetimeTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Check if the task should run at the given time.
Args:
current_time (datetime): The current datetime.
Returns:
bool: True if the task should run, False otherwise.
"""
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffenabledTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8fflast_run Tff7b72and Te6edf3current_time Tff7b72- Tff7b72selfTff7b72.Td2a8fflast_run Tff7b72< Te6edf3timedeltaTb4b4b4(Te6edf3minutesTff7b72=T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_match_cronTb4b4b4(Te6edf3current_timeTb4b4b4)
Tff7b72def Td2a8ff_match_cronTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dtTb4b4b4: Te6edf3datetimeTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Match the datetime against the cron expression.
Args:
dt (datetime): The datetime to match.
Returns:
bool: True if the datetime matches the cron expression, False otherwise.
"""
Te6edf3parts Tff7b72= Tff7b72selfTff7b72.Td2a8ffcron_exprTff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72!= T79c0ff5Tb4b4b4:
Tff7b72return Tff7b72False
Te6edf3minuteTb4b4b4, Te6edf3hourTb4b4b4, Te6edf3dayTb4b4b4, Te6edf3monthTb4b4b4, Te6edf3weekday Tff7b72= Te6edf3parts
Tff7b72return Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_match_fieldTb4b4b4(Te6edf3minuteTb4b4b4, Te6edf3dtTff7b72.Td2a8ffminuteTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff59Tb4b4b4)
Tff7b72and Tff7b72selfTff7b72.Td2a8ff_match_fieldTb4b4b4(Te6edf3hourTb4b4b4, Te6edf3dtTff7b72.Td2a8ffhourTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff23Tb4b4b4)
Tff7b72and Tff7b72selfTff7b72.Td2a8ff_match_fieldTb4b4b4(Te6edf3dayTb4b4b4, Te6edf3dtTff7b72.Td2a8ffdayTb4b4b4, T79c0ff1Tb4b4b4, T79c0ff31Tb4b4b4)
Tff7b72and Tff7b72selfTff7b72.Td2a8ff_match_fieldTb4b4b4(Te6edf3monthTb4b4b4, Te6edf3dtTff7b72.Td2a8ffmonthTb4b4b4, T79c0ff1Tb4b4b4, T79c0ff12Tb4b4b4)
Tff7b72and Te6edf3ScheduledTaskTff7b72.Td2a8ff_match_fieldTb4b4b4(Te6edf3weekdayTb4b4b4, Te6edf3dtTff7b72.Td2a8ffweekdayTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff6Tb4b4b4)
Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ff_match_fieldTb4b4b4(Te6edf3patternTb4b4b4: Tffa657strTb4b4b4, Te6edf3valueTb4b4b4: Tffa657intTb4b4b4, Te6edf3min_valTb4b4b4: Tffa657intTb4b4b4, Te6edf3max_valTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Match a cron field pattern.
Args:
pattern (str): The cron field pattern to match.
value (int): The value to check against the pattern.
min_val (int): The minimum allowed value.
max_val (int): The maximum allowed value.
Returns:
bool: True if the value matches the pattern, False otherwise.
"""
Tff7b72if Te6edf3pattern Tff7b72== Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4:
Tff7b72return Tff7b72True
Te6edf3parts Tff7b72= Te6edf3patternTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3part Tff7b72in Te6edf3partsTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ff-Ta5d6ff" Tff7b72in Te6edf3partTb4b4b4:
Te6edf3startTb4b4b4, Te6edf3end Tff7b72= Tffa657mapTb4b4b4(Tffa657intTb4b4b4, Te6edf3partTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3min_val Tff7b72<Tff7b72= Te6edf3start Tff7b72<Tff7b72= Te6edf3value Tff7b72<Tff7b72= Te6edf3end Tff7b72<Tff7b72= Te6edf3max_valTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72in Te6edf3partTb4b4b4:
Te6edf3step Tff7b72= Tffa657intTb4b4b4(Te6edf3partTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72% Te6edf3step Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Tffa657intTb4b4b4(Te6edf3partTb4b4b4) Tff7b72== Te6edf3valueTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False
Tff7b72class T56d364TaskSchedulerTb4b4b4:
T8b949e"""Manages scheduled tasks and background processes."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3botTb4b4b4)Tb4b4b4:
T8b949e"""Initialize the TaskScheduler.
Args:
bot: The bot instance.
"""
Tff7b72selfTff7b72.Td2a8ffbot Tff7b72= Te6edf3bot
Tff7b72selfTff7b72.Td2a8fftasksTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3ScheduledTaskTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffbackground_tasksTb4b4b4: Tffa657listTb4b4b4[Te6edf3ThreadTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffstop_event Tff7b72= Te6edf3EventTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflogger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)
Tff7b72def Td2a8ffscheduleTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4: Tffa657strTb4b4b4, Te6edf3cron_exprTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
T8b949e"""Decorator to schedule a task.
Args:
name (str): The name of the task.
cron_expr (str): The cron expression for the task.
"""
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4)Tb4b4b4:
T8b949e"""Adds the task to the scheduler."""
Tff7b72selfTff7b72.Td2a8ffadd_taskTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3funcTb4b4b4, Te6edf3cron_exprTb4b4b4)
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tff7b72def Td2a8ffadd_taskTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4: Tffa657strTb4b4b4, Te6edf3callbackTb4b4b4: Te6edf3CallableTb4b4b4, Te6edf3cron_exprTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
T8b949e"""Add a scheduled task.
Args:
name (str): The name of the task.
callback (Callable): The function to execute when the task runs.
cron_expr (str): A cron-style expression defining when the task should run.
"""
Tff7b72selfTff7b72.Td2a8fftasksTb4b4b4[Te6edf3nameTb4b4b4] Tff7b72= Te6edf3ScheduledTaskTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3callbackTb4b4b4, Te6edf3cron_exprTb4b4b4)
Tff7b72def Td2a8ffremove_taskTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
T8b949e"""Remove a scheduled task.
Args:
name (str): The name of the task to remove.
"""
Tff7b72selfTff7b72.Td2a8fftasksTff7b72.Td2a8ffpopTb4b4b4(Te6edf3nameTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Start the scheduler."""
Tff7b72selfTff7b72.Td2a8ffstop_eventTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Te6edf3scheduler_thread Tff7b72= Te6edf3ThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff_scheduler_loopTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3scheduler_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbackground_tasksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3scheduler_threadTb4b4b4)
Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Stop the scheduler."""
Tff7b72selfTff7b72.Td2a8ffstop_eventTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3task Tff7b72in Tff7b72selfTff7b72.Td2a8ffbackground_tasksTb4b4b4:
Te6edf3taskTff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbackground_tasksTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_scheduler_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Main scheduler loop. Checks and runs tasks based on their cron expressions."""
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ffstop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3current_time Tff7b72= Te6edf3datetimeTff7b72.Td2a8ffnowTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3task Tff7b72in Tff7b72selfTff7b72.Td2a8fftasksTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3taskTff7b72.Td2a8ffshould_runTb4b4b4(Te6edf3current_timeTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3taskTff7b72.Td2a8ffcallbackTb4b4b4(Tb4b4b4)
Te6edf3taskTff7b72.Td2a8fflast_run Tff7b72= Te6edf3current_time
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(
Ta5d6ff"Ta5d6ffError running task Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3taskTff7b72.Td2a8ffnameTb4b4b4,
Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff60 Tff7b72- Te6edf3datetimeTff7b72.Td2a8ffnowTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsecondTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────